/**
 * 
 */
package com.platform.common.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * <pre>
 * 功能：此例是一个序列化/反序列化的方法 ：
 * 
 * 主要思想是把一个对象写入对象输出流，然后把这个流里面的数据导入字节数组输出流
 * 再把字节数组输出流导入到字节数组。这时，由于byte[]数组是从ObjectOutputStream之后得来的， 
 * 那么是不可以new String(buff)的，因为其中包含了不可见字符，根本不是一个字符串。
 * 只能用sun.misc.BASE64Encoder把它翻译成字符串形式。 至此，这就完成了序列化成字符串行式的过程
 * 
 * 再通过sun.misc.BASE64Decoder().decodeBuffer把字符串转换成一个byte[]， 
 * 然后通过其反思路完成反序列化过程
 * </pre>
 * 
 * @author wei.gao
 */
public class SerializationUtils extends org.apache.commons.lang3.SerializationUtils implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -3751080678682732476L;
	
	/**
	 * <pre>
	 * 功能：Object对象序列化
	 * </pre>
	 * 
	 * @param obj
	 * @return
	 * @throws IOException
	 */
	public static String serialize(Object obj) throws IOException {
		String string = "";
		// 序列化使用的输出流
		ObjectOutputStream OOS = null;
		// 序列化后数据流给ByteArrayOutputStream 来保存。
		// ByteArrayOutputStream 可转成字符串或字节数组
		ByteArrayOutputStream BAOS = new ByteArrayOutputStream();
		try {
			OOS = new ObjectOutputStream(BAOS);
			OOS.writeObject(obj);
			byte[] buff = BAOS.toByteArray();
			
			// 使用BASE64Encoder转换成字符串
			string = ConvertUtils.convertEncodeBase64(buff);
		} finally {
			try {
				if (OOS != null) {
					OOS.close();
				}
				if (BAOS != null) {
					BAOS.close();
				}
			} catch (IOException e) {
			}
		}
		return string;
	}
	
	/**
	 * <pre>
	 * 功能：反序列化
	 * </pre>
	 * 
	 * @param str
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static Object deserialize(String str) throws IOException, ClassNotFoundException {
		Object obj = null;
		// ByteArrayInputStream 可接收一个字节数组"byte[]"。供反序列化做参数
		ByteArrayInputStream BAIS = null;
		// 反序列化使用的输入流
		ObjectInputStream OIS = null;
		try {
			// 把字符串转成一个byte[]
			byte[] DSbuff = ConvertUtils.convertDecodeBase64(str);
			// 实现反序列化
			BAIS = new ByteArrayInputStream(DSbuff);
			OIS = new ObjectInputStream(BAIS);
			obj = OIS.readObject();
		} finally {
			try {
				if (BAIS != null) {
					BAIS.close();
				}
				if (OIS != null) {
					OIS.close();
				}
			} catch (IOException e) {
			}
		}
		return obj;
	}
}
